#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

//定义单词频率的类，存储单词和该单词出现的次数
class WordFrequency{
public:
    string _word;
    int _sum;
    // 构造函数初始化该单词和出现的次数
    // 因为是初始化，这个单词第一次出现就是sum = 1，直接初始化赋值给他
    WordFrequency(string word, int sum = 1)
    :_word(word)
    ,_sum(sum)
    {   }
};

class Dictory{
public:
    //用这个构造函数初始化该vector动态数组的初始长度
    //避免后面连续的空间扩增（二倍扩增）
    Dictory(int capacity){
        _dict.reserve(capacity);
    }
    
    //一行一行读取，然后按空格分割字符进行记录
    void read(string IN_file){
        //开始文件输入流
        ifstream ifs(IN_file);
        // 设置行字符串记录存储这一行的数据
        string line;
        // getien()就是每次读取一行内容，存入字符串line里面
        while(getline(ifs,line)){
            // 开始按照空格拆分字符串
            istringstream iss(line);
            //定义一个word来接收每次拆分下来的单一字符串
            string word;
            while(iss >> word){
                size_t i = 0;
                // 遍历整个vector数组查看是否有这个字符串存在
                for(; i < _dict.size(); i++){
                    if(_dict[i]._word == word){
                        // 说明vector数组中存在这个字符串
                        // 那就进行该字符的总数自增操作
                        _dict[i]._sum++;
                        break;//结束了找到了这个就可以退出了没必要继续遍历了
                    }

                }
                //到这里说明遍历完了整个vector数组都没有这个字符串
                //那么就要把这个字符串添加进去
                if(i == _dict.size()){
                    _dict.push_back(WordFrequency(word));
                }
            }
        }
        ifs.close();
    }

    void write(string Out_file){
        ofstream ofs(Out_file);
        // 从vector中拿出内容写入统计每个字符串个数的文件中
        // 使用auto & ele : _dict 遍历vector动态数组
        for(auto & ele : _dict){
            ofs << ele._word << " " <<  ele._sum << endl;
        }
        ofs.close();
    }


private:
    vector<WordFrequency> _dict;
};

void test(){
    Dictory  dict(10000);
    dict.read("The_Holy_Bible.txt");
    dict.write("bible.txt");

}

int main(int atgc, char * argv[])
{
    test();
    return 0;
}

